package com.itheima.d6_lambda;

import com.itheima.d5_arrays.Student;
import java.util.Arrays;
import java.util.Comparator;
import java.util.function.IntToDoubleFunction;


/**
 *  Lambda表达式是JDK 8开始新增的一种语法形式； 作用：用于简化匿名内部类的代码写法。
 *  格式：                 注意 :  Lambda表达式只能简化函数式接口的匿名内部类!!!
 *  (被重写方法的形参列表) -> {
 *  被重写方法的方法体代码。
 *  }
 *
 * 什么是函数式接口？
 * 有且仅有一个抽象方法的接口。
 * 注意：将来我们见到的大部分函数式接口，上面都可能会有一个@FunctionalInterface的注解，有该注解的接口就必定是函数式接口。
 *
 */

/**
 * Lambda表达式的省略写法(进一步简化Lambda表达式的写法)
 * 参数类型可以省略不写。
 * 如果只有一个参数，参数类型可以省略，同时()也可以省略。
 * 如果Lambda表达式中的方法体代码只有一行代码，可以省略大括号不写，同时要省略分号！此时，如果这行代码是return语句，也必须去掉return不写。
 *
 */
public class LambdaTest2 {
    public static void main(String[] args) {
        // 目标：使用Lambda简化函数式接口。
        double[] prices = {99.8, 128, 100};


        //public interface IntToDoubleFunction 有这个@FunctionalInterface注解，就是一个函数式接口
        Arrays.setAll(prices, new IntToDoubleFunction() {
            @Override
            public double applyAsDouble(int value) {
                // value = 0  1  2
                return prices[value] * 0.8;
            }
        });


        Arrays.setAll(prices, (int value) -> {
                return prices[value] * 0.8;
        });

        //参数类型可以省略不写。
        Arrays.setAll(prices, (value) -> {
            return prices[value] * 0.8;
        });

        //如果只有一个参数，参数类型可以省略，同时()也可以省略。
        Arrays.setAll(prices, value -> {
            return prices[value] * 0.8;
        });

        //Lambda表达式中的方法体代码只有一行代码，可以省略大括号不写，同时要省略分号！此时，如果这行代码是return语句，也必须去掉return不写。
        Arrays.setAll(prices, value -> prices[value] * 0.8 );

        System.out.println(Arrays.toString(prices));
        System.out.println("----------------------------------------------------------");

        Student[] students = new Student[4];
        students[0] = new Student("蜘蛛精", 169.5, 23);
        students[1] = new Student("紫霞", 163.8, 26);
        students[2] = new Student("紫霞", 163.8, 26);
        students[3] = new Student("至尊宝", 167.5, 24);

        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Double.compare(o1.getHeight(), o2.getHeight()); // 升序
            }
        });

        Arrays.sort(students, (Student o1, Student o2) -> {
                return Double.compare(o1.getHeight(), o2.getHeight()); // 升序
        });

        Arrays.sort(students, ( o1,  o2) -> {
            return Double.compare(o1.getHeight(), o2.getHeight()); // 升序
        });

        Arrays.sort(students, ( o1,  o2) -> Double.compare(o1.getHeight(), o2.getHeight()));


        System.out.println(Arrays.toString(students));
    }
}
